package middle

import (
	"RoccBlog/api"
	"RoccBlog/global"
	"RoccBlog/model"
	"RoccBlog/util/constant"
	"github.com/gin-gonic/gin"
	"net/http"
	"strings"
)

// CaSbin 验证权限
func CaSbin() gin.HandlerFunc {
	controller := api.BaseController{}
	return func(ctx *gin.Context) {

		// 是否为白名单
		uri := strings.Split(ctx.Request.RequestURI, "?")[0]
		enforce, err := global.CaSbin.Enforce(constant.WhiteRole, uri, ctx.Request.Method)
		if enforce && err == nil {
			// 是白名单的路由，通过
			ctx.Next()
			return
		}

		// 是否有用户登录
		user, exists := ctx.Get(constant.ContextLoginUser)
		if !exists {
			// 无用户登录
			controller.Response(ctx, http.StatusForbidden, "Forbidden：访问已拒绝，无权限访问", nil)
			ctx.Abort()
			return
		}

		// 存在用户
		loginUser := user.(model.User)

		for _, role := range loginUser.Roles {
			enforce, err = global.CaSbin.Enforce(role.Code, uri, ctx.Request.Method)

			//权限校验错误跳出
			if err != nil {
				continue
			}

			//通过则下一步
			if enforce {
				// 通过验证
				ctx.Next()
				return
			}
		}

		controller.Response(ctx, http.StatusForbidden, "Forbidden：访问已拒绝，无权限访问", nil)
		ctx.Abort()
	}
}
